<?php

Yii::import('application.modules.carta.models._base.BaseCartaSemanal');

/**
 * Modelo (heredado) para la tabla cartaSemanal
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 */
class CartaSemanal extends BaseCartaSemanal {

    /**
     * @return CartaSemanal
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public static function label($n = 1) {
        return Yii::t('app', 'Menú Semanal|Menús Semanales', $n);
    }

    /**
     * Consulta que muestra los valores nutricionales de los alimentos de un dia de 
     * una carta semanal
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $idCartaSemanal
     * @param date $diaSemana
     * @return array
     */
    public function consultaDiariaCartaSemanal($idCartaSemanal, $diaSemana) { //TODO 
        $command = Yii::app()->db->createCommand()
                ->select('ca.cantidad as cantidad, al.nombre as alimento, vn.*')
                ->from('carta_semanal cs')
                ->leftJoin('carta_alimentos ca', 'cs.carta_nutricional_id = ca.id')
                ->leftJoin('alimentos al', 'ca.alimentos_id = al.id')
                ->leftJoin('valores_nutricionales vn', 'al.id=vn.alimentos_id')
                ->where('cs.info_carta_semanal_id= :idCartaSemanal AND cs.dia_semana = :diaSemanaLaborable', array(':idCartaSemanal' => $idCartaSemanal, ':diaSemanaLaborable' => $diaSemana));
        return $command->queryAll();
    }

    /**
     * Obtiene los valores nutricionales totales de los alimentos del dia 
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $idCartaSemanal
     * @param date $diaSemana
     * @return array
     */
    public function totalValoresNutricionalesDiarios($idCartaSemanal, $diaSemana) {
        $data = $this->consultaDiariaCartaSemanal($idCartaSemanal, $diaSemana);
        $valoresNutricionalesTotal = array();
        $cantidadValoresNutricionalesTotal = array();
        $nombresValoresNutricionales = array();
        $cantidadValoresNutricionales = array();
        foreach ($data as $key => $alimento) {
            $cantidadAlimento = $alimento['cantidad'];
            unset($alimento['cantidad']);
            unset($alimento['alimento']);
            unset($alimento['id']);
            unset($alimento['alimentos_id']);
            if ($key == 0) {
                $nombresValoresNutricionales = array_fill_keys(array_keys($alimento), 0);
                $cantidadValoresNutricionalesTotal = array_values($nombresValoresNutricionales);
            }
            $cantidadValoresNutricionales = array_values($alimento);
            if ($cantidadAlimento != "100.00") {
                foreach ($cantidadValoresNutricionales as $key => &$cantidadValorNutricional) {
                    $cantidadValorNutricional = $cantidadValorNutricional * $cantidadAlimento / 100;
                    $cantidadValorNutricional = round($cantidadValorNutricional, 2); //redondeo a 2 cifras
                }
            } else {
                foreach ($cantidadValoresNutricionales as $key => &$cantidadValorNutricional) {
                    $cantidadValorNutricional = $cantidadValorNutricional;
                    $cantidadValorNutricional = round($cantidadValorNutricional, 2); //redondeo a 2 cifras
                }
            }
            for ($i = 0; $i < sizeof($cantidadValoresNutricionales); $i++) {
                $cantidadValoresNutricionalesTotal[$i]+= $cantidadValoresNutricionales[$i];
            }
        }
        $valoresNutricionalesTotal = array_combine(array_keys($nombresValoresNutricionales), $cantidadValoresNutricionalesTotal);
        return $valoresNutricionalesTotal;
    }

    /**
     * Genera los 5 reportes para los dias de la semana indicando la cantidad de
     *  los valores nutricionales de un menu semanal ademas de cambiar a kcal 
     * las grasas, cho y proteinas
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param type $idCartaSemanal
     * @return type
     */
    public function generarReport($idCartaSemanal) {
        $reportes = array();
        $report['xAxis']['categories'] = array();
        $report['series'] = array();
        $diasSemana = Util::getDiasLaborablesSemanaEs();
        $nombresValN = array();
        foreach ($diasSemana as $diaSemana) {
            $cartaSemanal = $this->totalValoresNutricionalesDiarios($idCartaSemanal, $diaSemana);
            array_push($reportes, $cartaSemanal);
        }
        foreach ($reportes[0] as $key => &$value) {
            $val = Util::getCambioNombreValNutricional($key) . ' ' . Util::getMedidasValoresNutricionales($key);
            $nombresValN[$val] = $val;
            if ($key == 'proteinas_g' || $key == 'carbohidratos_g') { // para proteinas y CHO
                $value = round($value * 4, 2);
            } else if ($key == 'grasa_total_g' || $key == 'acidos_grasos_monoinsat_g' ||
                    $key == 'acidos_grasos_poliinsaturad_g' || $key == 'acidos_grasos_saturados_g') { //grasas
                $value = round($value * 9, 2);
            }
        }

        foreach ($reportes as $key => $valores) {
            if (gettype($key) == 'integer') {
                unset($reportes[$key]);
                $reportes[$key]['xAxis']['categories'] = array_keys($nombresValN);
                $reportes[$key]['series'][0]['data'] = array_values($valores);
                $reportes[$key]['series'][0]['name'] = $diasSemana[$key];
            }
        }
        return $reportes;
    }

    /**
     * Permite validar o guardar el alimento de un menu deacuerdo al ultimo atributo
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param String $value contiene el dia_semana
     * @param int $key id del carta_alimentos correspondiente
     * @param int $id_ICS si es null, valida, caso contrario guarda
     * @return type
     */
    public function validateOrSaveMenuCartaSemanal($value, $key, $id_ICS = null) {
        $model = new CartaSemanal;
        $model->carta_nutricional_id = $key;
        $model->dia_semana = $value;
        $model->info_carta_semanal_id = $id_ICS != null ? $id_ICS : 1;
        return $id_ICS != null ? $model->save() : $model->validate();
    }

    /**
     * Permite validar o actualizar un menusemanal
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $id_carta_semanal seleccionado
     * @param int $nueva_carta_id que será actualizada
     * @param boolean $validate si es true valida si es false guarda
     * @return boolean
     */
    public function validateOrUpdateMenuCartaSemanal($id_carta_semanal, $nueva_carta_id, $validate = true) {
        $model = $this->model()->findByPk((int)$id_carta_semanal);
        $model->carta_nutricional_id = $nueva_carta_id . "";
        return $validate == true ? $model->validate() : $model->save();
    }

    /**
     * Recupera la carta semanal que contenga el id de infoCartaSemal seleccionado
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * @param int $id_ICS del infoCartaSemanal seleccionado
     * @return \CartaSemanal
     */
    public function de_InfoCartaSemanal_Id($id_ICS) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.info_carta_semanal_id=:info_carta_semanal_id',
                    'params' => array(
                        ':info_carta_semanal_id' => $id_ICS,
                    )
                )
        );
        return $this;
    }
    
    /**
     * Busca el menu segun el dia seleccionado  y el menu semanal
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param type $id_ICS id del menu semanal
     * @param type $diaSemana dia de la semana
     * @return \CartaSemanal
     */
    public function de_Dia_InfoCartaSemanal_Id($id_ICS, $diaSemana) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.info_carta_semanal_id=:info_carta_semanal_id and t.dia_semana=:diaSemana',
                    'params' => array(
                        ':info_carta_semanal_id' => $id_ICS,
                        ':diaSemana' => $diaSemana,
                    )
                )
        );
        return $this;
    }

    /**
     * Busca todos las cartasemanales que pertenescan al infocartasemanal
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $id del infocartasemanal seleccionado
     * @return un array con los id de los menus mas el dia de la semana correspondiente
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     */
    public function busquedaMenusICS($id_ICS) {
        $cartas_semanales = $this->de_InfoCartaSemanal_Id($id_ICS)->findAll();
        $carta_nutricional = array();
        foreach ($cartas_semanales as $value) {
            array_push($carta_nutricional, array("," . $value->carta_nutricional_id, $value->dia_semana, $value->id));
        }
        $carta_nutricional = array_map("unserialize", array_unique(array_map("serialize", $carta_nutricional)));
        return $carta_nutricional;
    }
/**
 * Etapa 2
 * --------------------------------------------------------------------------------------------------------------------------------------------------------
 */
    /**
     * Clona los datos de una carta semanal
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * @param int $id_InfoCartaSemanal
     * @param int $nuevo_id
     * @throws Exception
     */
    public function clonarCartaSemanal($id_InfoCartaSemanal, $nuevo_id) {
        $transaction = $this->getDbConnection()->beginTransaction();
        try {
            $sql1 = 'CREATE TABLE vista_carta_semanal AS (SELECT cs.dia_semana, cs.tipo_carta_id, cs.carta_alimentos_id, cs.info_carta_semanal_id FROM carta_semanal cs where cs.info_carta_semanal_id=:id)';
            $command = $this->getDbConnection()->createCommand($sql1)->bindValue(':id', $id_InfoCartaSemanal);
            $command->execute();
            $this->actualizarVistaCartaSemanal($nuevo_id);
            $this->guardarRegistrosClonados($nuevo_id);
            $this->eliminarVistaCartaSemanal();
            $transaction->commit();
        } catch (Exception $e) {
            $transaction->rollback(); //Todo chekar en funcionamiento
            throw new Exception("no se pudo clonar");
        }
    }

    /**
     * Permite actualizar la columna info_carta_semanal de una vista
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $nuevo_id
     */
    public function actualizarVistaCartaSemanal($nuevo_id) {
        $sql1 = 'UPDATE vista_carta_semanal vca SET vca.info_carta_semanal_id =:id';
        $command = $this->getDbConnection()->createCommand($sql1)->bindValue(':id', $nuevo_id);
        $command->execute();
    }

    /**
     * Guarda los resgistros para carta alimentos previamente clonados
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $nuevo_id
     */
    public function guardarRegistrosClonados($nuevo_id) {
        $sql1 = 'INSERT INTO  `carta_semanal` ( `dia_semana` ,  `tipo_carta_id` ,  `carta_alimentos_id` ,  `info_carta_semanal_id` ) 
                SELECT cva.dia_semana, cva.tipo_carta_id, cva.carta_alimentos_id, cva.info_carta_semanal_id
                FROM vista_carta_semanal cva
                WHERE cva.info_carta_semanal_id =:id
                ';
        $command = $this->getDbConnection()->createCommand($sql1)->bindValue(':id', $nuevo_id);
        $command->execute();
    }

    /**
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * elimina la tabla vista_carta_semanal
     */
    public function eliminarVistaCartaSemanal() {
        $sql1 = 'DROP TABLE vista_carta_semanal';
        $command = $this->getDbConnection()->createCommand($sql1);
        $command->execute();
    }
/**
 * Fin etapa 2
 * -----------------------------------------------------------------------------------------------------------------------------------------------
 */
}
